﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Collections.Generic;
using WR.BL.BE;
using WR.BL.BCC;

namespace WR.UI.MobWebApp
{
    public partial class crearcot : System.Web.UI.Page
    {
        private UserBE _objUsr;
        private void checkLogin()
        {
            lblErrorMsg.InnerHtml = string.Empty;
            _objUsr = (UserBE)Session["UserBE"];
            if (_objUsr == null)
            {
                Response.Redirect("login.aspx");
            }
        }

        private void cargarCombos()
        {
            List<GenericBE> lstClaseDoc = (List<GenericBE>)Session["lstClaseDoc"];
            if (lstClaseDoc == null || lstClaseDoc.Count == 0)
            {
                lstClaseDoc = SalesOrderBC.getInstance(Session.SessionID).getClaseDoc(string.Empty, string.Empty);
                Session["lstClaseDoc"] = lstClaseDoc;
            }
            lbAuart.DataSource = lstClaseDoc;
            lbAuart.DataBind();
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            SalesOrderBE objSO = null;
            string retVal = string.Empty;
            string valCli = string.Empty;
            try
            {
                this.checkLogin();

                if (!Page.IsPostBack)
                {
                    // cancelar modificación
                    string strAction = Page.Request.QueryString["act"];
                    if (!string.IsNullOrEmpty(strAction))
                    {
                        if (strAction == "cancel")
                        {
                            objSO = new SalesOrderBE();
                            Session["SalesOrderBE"] = objSO;
                        }
                    }

                    // Consulta de cotizaciónes
                    string strCotId = Page.Request.QueryString["oid"];
                    string strCodUsr = Page.Request.QueryString["cod"];
                    if (!string.IsNullOrEmpty(strCotId))
                    {
                        retVal = SalesOrderBC.getInstance(Session.SessionID).read(strCotId, out objSO);
                        if (!string.IsNullOrEmpty(retVal))
                        {
                            throw new Exception(retVal);
                        }
                        else
                        {
                            Session["SalesOrderBE"] = objSO;
                        }
                        //Verifica si es cliente eventual
                        valCli = ClientBC.getInstance(Session.SessionID).cliEventual(strCodUsr);
                        if (!string.IsNullOrEmpty(valCli))
                        {
                            lblDatosCliente.InnerHtml = "Datos Cliente";
                        }
                    }

                    // Obtener pedido de sesión
                    objSO = (SalesOrderBE)Session["SalesOrderBE"];
                    if (objSO == null) { objSO = new SalesOrderBE(); }

                    // inidcar acción actual
                    if (string.IsNullOrEmpty(objSO.NumDoc))
                    {
                        //creando
                        lblOkMsg.InnerHtml = "Creando nuevo documento";
                        lblOkMsg.InnerHtml += " <a href=\"crearcot.aspx?act=cancel\">[cancelar]</a>";
                    }
                    else
                    {
                        //modificando
                        lblOkMsg.InnerHtml = "Modificando documento: " + objSO.NumDoc;
                        lblOkMsg.InnerHtml += " <a href=\"crearcot.aspx?act=cancel\">[cancelar]</a>";
                    }

                    //---
                    // Eliminar posición
                    string strPos = Page.Request.QueryString["del"];
                    if (!string.IsNullOrEmpty(strPos))
                    {
                        if (objSO.Detalle != null)
                        {
                            objSO.Detalle.RemoveAt(objSO.Detalle.FindIndex(X => X.Pos == strPos));
                        }
                    }

                    //---
                    // Bindear detalle y cliente
                    this.cargarCombos();
                    if (!string.IsNullOrEmpty(objSO.ClaseDoc))
                    {
                        //txtAuart.Value = objSO.ClaseDoc;
                        lbAuart.SelectedValue = objSO.ClaseDoc;
                    }
                    if (objSO.Detalle != null)
                    {
                        lvDetalle.DataSource = objSO.Detalle;
                        lvDetalle.DataBind();
                        
                        HtmlGenericControl lblTotal = (HtmlGenericControl)lvDetalle.FindControl("lblTotal");
                        if (lblTotal != null)
                        {
                            lblTotal.InnerHtml = objSO.TotalDet.ToString("0,0.00");
                        }
                    }
                    if (objSO.Cliente != null && !string.IsNullOrEmpty(objSO.Cliente.Codigo))
                    {
                        txtKunnr.Value = objSO.Cliente.Codigo.Trim();
                        lblName1.InnerHtml = objSO.Cliente.Descripcion.Trim();
                    }
                    //---
                    // Retorno de búsqueda de cliente:
                    string strCliId = Page.Request.QueryString["cid"];
                    ClientBE objCli = null;

                    if (!string.IsNullOrEmpty(strCliId))
                    {
                        strCliId = strCliId.Trim();
                        List<ClientBE> lstClientes = (List<ClientBE>)Session["lstClientes"];
                        if (lstClientes != null)
                        {
                            objCli = lstClientes.Find(X => X.Codigo == strCliId);
                        }
                        else
                        {
                            objCli = ClientBC.getInstance(Session.SessionID).read(strCliId);
                        }
                        if (objCli != null)
                        {
                            txtKunnr.Value = objCli.Codigo.Trim();
                            lblName1.InnerHtml = objCli.Descripcion.Trim();
                        }
                        valCli = ClientBC.getInstance(Session.SessionID).cliEventual(strCliId);
                        if (!string.IsNullOrEmpty(valCli))
                        {
                            lblDatosCliente.InnerHtml = "Datos Cliente";
                        }
                        //btnDetCli.HRef = string.Format(btnDetCli.HRef, objCli.Codigo);
                        objSO.Cliente = objCli;
                    }

                    

                    //-- asignar siempre tienda (se asume que las consultas son siempre sobre la tienda seleccionada)
                    _objUsr = (UserBE)Session["UserBE"];
                    objSO.Usuario.Tienda = _objUsr.Tienda;
                    
                    valCli = ClientBC.getInstance(Session.SessionID).cliEventual(txtKunnr.Value).ToString();
                    if (!string.IsNullOrEmpty(valCli))
                    {
                        lblDatosCliente.InnerHtml = "Datos Cliente";
                        //btnDetCli.HRef = string.Format(btnDetCli.HRef, objSO.Cliente.Codigo);
                    }

                    Session["SalesOrderBE"] = objSO;
                }
            }
            catch (Exception ex)
            {
                lblErrorMsg.InnerHtml = ex.Message;
            }
        }

        private void validaDoc()
        {
            string retval = string.Empty; string strAux;
            SalesOrderBE objSO = (SalesOrderBE)Session["SalesOrderBE"];

            strAux = lbAuart.SelectedValue.Trim();// txtAuart.Value.Trim();
            if (string.IsNullOrEmpty(strAux))
            {
                retval = "Falta especificar Clase doc.";
                throw new Exception(retval);
            }
            else
            {
                objSO.ClaseDoc = strAux;
            }

            strAux = txtKunnr.Value.Trim();
            if (string.IsNullOrEmpty(strAux))
            {
                retval = "Falta especificar Cliente";
                throw new Exception(retval);
            }
            else
            {
                if (objSO.Cliente.Codigo != strAux)
                {
                    objSO.Cliente = ClientBC.getInstance(Session.SessionID).read(strAux);
                }
            }

            if (objSO.Detalle.Count == 0)
            {
                retval = "Falta seleccionar materiales";
                throw new Exception(retval);
            }

            Session["SalesOrderBE"] = objSO;
        }

        protected void lnkSave_Click(object o, EventArgs e)
        {
            string retVal = string.Empty;
            try
            {
                this.validaDoc();
                string valCli = string.Empty;
                valCli = ClientBC.getInstance(Session.SessionID).cliEventual(txtKunnr.Value).ToString();
                
                SalesOrderBE objSO = (SalesOrderBE)Session["SalesOrderBE"];
                string oNumDoc = string.Empty; bool oModificado = false;
                if (objSO != null)
                {
                    if (string.IsNullOrEmpty(objSO.NumDoc))
                    {
                        retVal = SalesOrderBC.getInstance(Session.SessionID).save(objSO, out oNumDoc, valCli);
                    }
                    else
                    {
                        retVal = SalesOrderBC.getInstance(Session.SessionID).update(objSO, out oModificado,valCli);
                    }

                    if (string.IsNullOrEmpty(retVal))
                    {
                        if (string.IsNullOrEmpty(oNumDoc))//falló creación (modif. siempre retorna mensaje)
                        {
                            throw new Exception("Falló la creación del documento.");
                            //lblErrorMsg.InnerHtml = "Falló la creación del documento.";
                        }
                    }
                    else
                    {
                        if (string.IsNullOrEmpty(oNumDoc))//falló creación ó se está modificando
                        {
                            if (string.IsNullOrEmpty(objSO.NumDoc))
                            {
                                throw new Exception(retVal);
                                //lblErrorMsg.InnerHtml = retVal;
                            }
                            else
                            {
                                if (oModificado)//modificación ok
                                {
                                    lblOkMsg.InnerHtml = retVal;
                                    retVal = string.Empty;
                                }
                                else
                                {
                                    throw new Exception(retVal);
                                    //lblErrorMsg.InnerHtml = retVal;
                                }
                            }
                        }
                        else//creación ok
                        {
                            lblOkMsg.InnerHtml = retVal;
                            retVal = string.Empty;
                        }
                    }
                }
                else
                {
                    throw new Exception("No se está creando/modificando ningún documento");
                }
            }
            catch (Exception ex)
            {
                retVal = ex.Message;
            }
            lblErrorMsg.InnerHtml = retVal;
        }

        protected void lnkSend_Click(object o, EventArgs e)
        {
            this.grabarDoc(true);
        }

        private void grabarDoc(bool correo)
        {
            string retVal = string.Empty;
            try
            {
                this.validaDoc();

                SalesOrderBE objSO = (SalesOrderBE)Session["SalesOrderBE"];
                string oNumDoc = string.Empty; bool oModificado = false;
                string valCli = string.Empty;
                valCli = ClientBC.getInstance(Session.SessionID).cliEventual(txtKunnr.Value).ToString();
                if (objSO != null)
                {
                    if (string.IsNullOrEmpty(objSO.NumDoc))
                    {
                        retVal = SalesOrderBC.getInstance(Session.SessionID).save(objSO, out oNumDoc, valCli);
                    }
                    else
                    {
                        retVal = SalesOrderBC.getInstance(Session.SessionID).update(objSO, out oModificado, valCli);
                    }

                    if (string.IsNullOrEmpty(retVal))
                    {
                        if (string.IsNullOrEmpty(oNumDoc))//falló creación (modif. siempre retorna mensaje)
                        {
                            throw new Exception("Falló la creación del documento.");
                            //lblErrorMsg.InnerHtml = "Falló la creación del documento.";
                        }
                    }
                    else
                    {
                        if (string.IsNullOrEmpty(oNumDoc))//falló creación ó se está modificando
                        {
                            if (string.IsNullOrEmpty(objSO.NumDoc))
                            {
                                throw new Exception(retVal);
                            }
                            else
                            {
                                if (oModificado)//modificación ok
                                {
                                    lblOkMsg.InnerHtml = retVal;
                                    retVal = string.Empty;
                                    if (correo)
                                    {
                                        Response.Redirect("send.aspx?nd=" + objSO.NumDoc);
                                    }
                                }
                                else
                                {
                                    throw new Exception(retVal);
                                }
                            }
                        }
                        else//creación ok
                        {
                            lblOkMsg.InnerHtml = retVal;
                            retVal = string.Empty;
                            if (correo)
                            {
                                Response.Redirect("send.aspx?nd=" + oNumDoc);
                            }
                        }
                    }
                }
                else
                {
                    throw new Exception("No se está creando/modificando ningún documento");
                }
            }
            catch (Exception ex)
            {
                retVal = ex.Message;
            }
            lblErrorMsg.InnerHtml = retVal;
        }
    }
}
